import jwt
import time
from flask import current_app


# JWT的生成与验证模块
class JwtTool:
    def create_token(self, payload, exp, secret=None):
        '''
        :param payload: 载荷
        :param exp: 过期时间，秒数
        :param secret: 盐，可选
        :return: JWT Token
        '''
        if not secret:
            secret = current_app.config["SECRET_KEY"]

        payload["exp"] = int(time.time()) + exp  # 有效期 =  当前时间 + 过期的时间

        token = jwt.encode(payload, key=secret, algorithm="HS256")

        return token

    def ver_token(self, token, secret=None):
        '''
        验证 Token
        :param token: 要验证的Token
        :param secret: 盐，可选
        :return: payload
        '''

        if not secret:
            secret = current_app.config["SECRET_KEY"]
        try:
            payload = jwt.decode(token, secret, algorithms="HS256")
            # decode 会自动去验证有效期字段[exp]，
            # # 判断token的有效期  有效期 跟 当前时间 比，如果 有效期 < 当前时间，说明过期了
            # if payload["exp"] < int(time.time()):
            #     print("过期了")
            #     payload = None

        except Exception as e:
            print("报错了", e)
            payload = None

        return payload


if __name__ == '__main__':  # python xxx.py   直接运行的时候才会执行，如果是导包导到别的地方，则不会执行
    from app import app

    # 以下是一些测试用例
    with app.app_context():
        j = JwtTool()
        t = j.create_token({
            "uid": 100,
            "name": "张三"
        }, 5)
        print(t)
        t = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEwMCwibmFtZSI6Ilx1NWYyMFx1NGUwOSIsImV4cDEiOjE2NTY0NjgwMTF9.MOz2lqhTyVOUX6gsl1VzvXBv9Narp4iR-d7Ojm1uwY8"
        p = j.ver_token(t)
        print(t)
        print(p)
